package com.simpou.commons.utils.compiler;

import lombok.Getter;

import java.util.List;
import java.util.Locale;

import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaFileObject;


/**
 * Erros de compilação.
 *
 * @author Jonas Pereira
 * @since 2011-08-18
 * @version 2012-07-13
 */
public class CompilerException extends Exception {
    /**
     * Mensagens de erro de compilação.
     */
    @Getter
    private final DiagnosticCollector<JavaFileObject> diagnostics;

    /**
     * <p>Constructor for CompilerException.</p>
     *
     * @param msg Mensagem.
     */
    CompilerException(final String msg) {
        this(msg, null, null);
    }

    /**
     * <p>Constructor for CompilerException.</p>
     *
     * @param msg Mensagem.
     * @param diagnostics Erros de compilação.
     */
    CompilerException(final String msg,
        final DiagnosticCollector<JavaFileObject> diagnostics) {
        this(msg, null, diagnostics);
    }

    /**
     * <p>Constructor for CompilerException.</p>
     *
     * @param msg Mensagem.
     * @param thrwbl Exceção.
     * @param diagnostics Erros de compilação.
     */
    CompilerException(final String msg, final Throwable thrwbl,
        final DiagnosticCollector<JavaFileObject> diagnostics) {
        super(msg, thrwbl);
        this.diagnostics = diagnostics;
    }

    /** {@inheritDoc} */
    @Override
    public String getMessage() {
        StringBuilder buffer = new StringBuilder(super.getMessage());

        if (diagnostics != null) {
            buffer.append("\n");

            List<Diagnostic<?extends JavaFileObject>> list = diagnostics.getDiagnostics();

            for (Diagnostic<?extends JavaFileObject> diagnostic : list) {
                buffer.append("(").append(diagnostic.getLineNumber());
                buffer.append(",").append(diagnostic.getColumnNumber())
                      .append(") ");
                buffer.append(diagnostic.getMessage(Locale.getDefault()))
                      .append("\n");
            }
        }

        return buffer.toString();
    }

    @Override
    public String toString() {
        return this.getMessage();
    }
}
